home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 21 / Cream of the Crop 21 (Terry Blount) (October 1996).iso / os2 / vsoup11.zip / pop3.cc < prev    next >
C/C++ Source or Header  |  1996-09-01  |  12KB  |  434 lines

  1. /* $Id: pop3.cc 1.9 1996/09/01 12:11:23 hardy Exp $
  2.  *
  3.  * This module has been modified for souper.
  4.  */
  5.  
  6. /* Copyright 1993,1994 by Carl Harris, Jr.
  7.  * All rights reserved
  8.  *
  9.  * Distribute freely, except: don't remove my name from the source or
  10.  * documentation (don't take credit for my work), mark your changes (don't
  11.  * get me blamed for your possible bugs), don't alter or remove this
  12.  * notice.  May be sold if buildable source is provided to buyer.  No
  13.  * warrantee of any kind, express or implied, is included with this
  14.  * software; use at your own risk, responsibility for damages (if any) to
  15.  * anyone resulting from the use of this software rests entirely with the
  16.  * user.
  17.  *
  18.  * Send bug reports, bug fixes, enhancements, requests, flames, etc., and
  19.  * I'll try to keep a version up to date.  I can be reached as follows:
  20.  * Carl Harris <ceharris@vt.edu>
  21.  */
  22.  
  23. //
  24. //  This progam/module was written by Hardy Griech based on ideas and
  25. //  pieces of code from Chin Huang (cthuang@io.org).  Bug reports should
  26. //  be submitted to rgriech@ibm.net.
  27. //
  28. //  This file is part of soup++ for OS/2.  Soup++ including this file
  29. //  is freeware.  There is no warranty of any kind implied.  The terms
  30. //  of the GNU Gernal Public Licence are valid for this piece of software.
  31. //
  32. //  NNTP client routines
  33. //
  34.  
  35. /***********************************************************************
  36.   module:       pop3.c
  37.   program:      popclient
  38.   SCCS ID:      @(#)pop3.c      2.4  3/31/94
  39.   programmer:   Carl Harris, ceharris@vt.edu
  40.   date:         29 December 1993
  41.   compiler:     DEC RISC C compiler (Ultrix 4.1)
  42.   environment:  DEC Ultrix 4.3 
  43.   description:  POP2 client code.
  44.  ***********************************************************************/
  45.  
  46.  
  47. #include <stdio.h>
  48. #include <stdlib.h>
  49. #include <sys/time.h>
  50. #include <ctype.h>
  51. #include <string.h>
  52.  
  53. #include "areas.hh"
  54. #include "global.hh"
  55. #include "mts.hh"
  56. #include "pop3.hh"
  57. #include "socket.hh"
  58.  
  59.  
  60. /* exit code values */
  61.  
  62. enum PopRetCode {ps_success,      // successful receipt of messages
  63.                  ps_socket,       // socket I/O woes
  64.                  ps_protocol,     // protocol violation
  65.                  ps_error         // some kind of POP3 error condition
  66. };
  67.  
  68.  
  69. /*********************************************************************
  70.   function:      POP3_ok
  71.   description:   get the server's response to a command, and return
  72.                  the extra arguments sent with the response.
  73.   arguments:     
  74.     argbuf       buffer to receive the argument string (==NULL -> no return)
  75.     socket       socket to which the server is connected.
  76.  
  77.   return value:  zero if okay, else return code.
  78.   calls:         SockGets
  79.  *********************************************************************/
  80.  
  81. static PopRetCode POP3_ok(char *argbuf, TSocket &socket)
  82. {
  83.     PopRetCode ok;
  84.     char buf[BUFSIZ];
  85.     char *bufp;
  86.  
  87.     if (socket.gets(buf, sizeof(buf))) {
  88.     bufp = buf;
  89.     if (*bufp == '+' || *bufp == '-')
  90.         bufp++;
  91.     else
  92.         return(ps_protocol);
  93.  
  94.     while (isalpha(*bufp))
  95.         bufp++;
  96.     *(bufp++) = '\0';
  97.     
  98.     if (strcmp(buf,"+OK") == 0)
  99.         ok = ps_success;
  100.     else if (strcmp(buf,"-ERR") == 0)
  101.         ok = ps_error;
  102.     else
  103.         ok = ps_protocol;
  104.     
  105.     if (argbuf != NULL)
  106.         strcpy(argbuf,bufp);
  107.     }
  108.     else 
  109.     ok = ps_socket;
  110.     
  111.     return(ok);
  112. }   // POP3_ok
  113.  
  114.  
  115.  
  116. /*********************************************************************
  117.   function:      POP3_Auth
  118.   description:   send the USER and PASS commands to the server, and
  119.                  get the server's response.
  120.   arguments:     
  121.     userid       user's mailserver id.
  122.     password     user's mailserver password.
  123.     socket       socket to which the server is connected.
  124.  
  125.   return value:  non-zero if success, else zero.
  126.   calls:         SockPrintf, POP3_ok.
  127.  *********************************************************************/
  128.  
  129. static PopRetCode POP3_Auth(const char *userid, const char *password, TSocket &socket) 
  130. {
  131.     PopRetCode ok;
  132.     char buf[BUFSIZ];
  133.  
  134.     socket.printf("USER %s\r\n",userid);
  135.     if ((ok = POP3_ok(buf,socket)) == ps_success) {
  136.     socket.printf("PASS %s\r\n",password);
  137.     if ((ok = POP3_ok(buf,socket)) == ps_success) 
  138.         ;  //  okay, we're approved.. 
  139.     else
  140.         areas.mailPrintf1( 1,"%s\n",buf);
  141.     }
  142.     else
  143.     areas.mailPrintf1(1,"%s\n",buf);
  144.     
  145.     return(ok);
  146. }   // POP3_Auth
  147.  
  148.  
  149.  
  150.  
  151. /*********************************************************************
  152.   function:      POP3_sendQuit
  153.   description:   send the QUIT command to the server and close 
  154.                  the socket.
  155.  
  156.   arguments:     
  157.     socket       socket to which the server is connected.
  158.  
  159.   return value:  none.
  160.   calls:         SockPuts, POP3_ok.
  161.  *********************************************************************/
  162.  
  163. static PopRetCode POP3_sendQuit(TSocket &socket)
  164. {
  165.     char buf[BUFSIZ];
  166.     PopRetCode ok;
  167.  
  168. #ifdef DEBUG
  169.     printfT( "POP3_sendQuit(): QUIT\n" );
  170. #endif
  171.     socket.puts("QUIT");
  172.     ok = POP3_ok(buf,socket);
  173.     if (ok != ps_success)
  174.     areas.mailPrintf1( 1,"%s\n",buf);
  175.  
  176.     return(ok);
  177. }   // POP3_sendQuit
  178.  
  179.  
  180.  
  181. /*********************************************************************
  182.   function:      POP3_sendStat
  183.   description:   send the STAT command to the POP3 server to find
  184.                  out how many messages are waiting.
  185.   arguments:     
  186.     count        pointer to an integer to receive the message count.
  187.     socket       socket to which the POP3 server is connected.
  188.  
  189.   return value:  return code from POP3_ok.
  190.   calls:         POP3_ok, SockPrintf
  191.  *********************************************************************/
  192.  
  193. static PopRetCode POP3_sendStat(int *msgcount, TSocket &socket)
  194. {
  195.     PopRetCode ok;
  196.     char buf[BUFSIZ];
  197.     int totalsize;
  198.     
  199.     socket.puts("STAT");
  200.     ok = POP3_ok(buf,socket);
  201.     if (ok == ps_success)
  202.     sscanfT(buf,"%d %d",msgcount,&totalsize);
  203.     else
  204.     areas.mailPrintf1( 1,"%s\n",buf);
  205.  
  206.     return(ok);
  207. }   // POP3_sendStat
  208.  
  209.  
  210.  
  211.  
  212. /*********************************************************************
  213.   function:      POP3_sendRetr
  214.   description:   send the RETR command to the POP3 server.
  215.   arguments:     
  216.     msgnum       message ID number
  217.     socket       socket to which the POP3 server is connected.
  218.  
  219.   return value:  return code from POP3_ok.
  220.   calls:         POP3_ok, SockPrintf
  221.  *********************************************************************/
  222.  
  223. static PopRetCode POP3_sendRetr(int msgnum, TSocket &socket)
  224. {
  225.     PopRetCode ok;
  226.     char buf[BUFSIZ];
  227.  
  228.     socket.printf("RETR %d\n",msgnum);
  229.     ok = POP3_ok(buf,socket);
  230.     if (ok != ps_success)
  231.     areas.mailPrintf1( 1,"%s\n",buf);
  232.  
  233.     return(ok);
  234. }   // POP3_sendRetr
  235.  
  236.  
  237.  
  238. /*********************************************************************
  239.   function:      POP3_sendDele
  240.   description:   send the DELE command to the POP3 server.
  241.   arguments:     
  242.     msgnum       message ID number
  243.     socket       socket to which the POP3 server is connected.
  244.  
  245.   return value:  return code from POP3_ok.
  246.   calls:         POP3_ok, SockPrintF.
  247.  *********************************************************************/
  248.  
  249. static PopRetCode POP3_sendDele(int msgnum, TSocket &socket)
  250. {
  251.     PopRetCode ok;
  252.     char buf[BUFSIZ];
  253.  
  254.     socket.printf("DELE %d\n",msgnum);
  255.     ok = POP3_ok(buf,socket);
  256.     if (ok != ps_success)
  257.     areas.mailPrintf1(1,"%s\n",buf);
  258.  
  259.     return(ok);
  260. }   // POP3_sendDele
  261.  
  262.  
  263.  
  264. /*********************************************************************
  265.   function:      POP3_readmsg
  266.   description:   Read the message content as described in RFC 1225.
  267.                  RETR with reply evaluation has been done before
  268.   arguments:     
  269.     socket       ... to which the server is connected.
  270.     mboxfd       open file descriptor to which the retrieved message will
  271.                  be written.  
  272.     topipe       true if we're writing to the system mailbox pipe.
  273.  
  274.   return value:  zero if success else PS_* return code.
  275.   calls:         SockGets.
  276.  ****************************